{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "import pandas as pd \n",
    "pd.options.display.max_columns = 100\n",
    "import numpy as np\n",
    "from scipy.stats import stats\n",
    "import seaborn as sns \n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.linear_model import Ridge, RidgeCV, LassoCV\n",
    "from sklearn.model_selection import cross_val_score\n",
    "from sklearn.pipeline import make_pipeline\n",
    "\n",
    "\n",
    "train = pd.read_csv('train.csv')\n",
    "test = pd.read_csv('test.csv')\n",
    "testId = test.Id"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Id</th>\n",
       "      <th>MSSubClass</th>\n",
       "      <th>MSZoning</th>\n",
       "      <th>LotFrontage</th>\n",
       "      <th>LotArea</th>\n",
       "      <th>Street</th>\n",
       "      <th>Alley</th>\n",
       "      <th>LotShape</th>\n",
       "      <th>LandContour</th>\n",
       "      <th>Utilities</th>\n",
       "      <th>LotConfig</th>\n",
       "      <th>LandSlope</th>\n",
       "      <th>Neighborhood</th>\n",
       "      <th>Condition1</th>\n",
       "      <th>Condition2</th>\n",
       "      <th>BldgType</th>\n",
       "      <th>HouseStyle</th>\n",
       "      <th>OverallQual</th>\n",
       "      <th>OverallCond</th>\n",
       "      <th>YearBuilt</th>\n",
       "      <th>YearRemodAdd</th>\n",
       "      <th>RoofStyle</th>\n",
       "      <th>RoofMatl</th>\n",
       "      <th>Exterior1st</th>\n",
       "      <th>Exterior2nd</th>\n",
       "      <th>MasVnrType</th>\n",
       "      <th>MasVnrArea</th>\n",
       "      <th>ExterQual</th>\n",
       "      <th>ExterCond</th>\n",
       "      <th>Foundation</th>\n",
       "      <th>BsmtQual</th>\n",
       "      <th>BsmtCond</th>\n",
       "      <th>BsmtExposure</th>\n",
       "      <th>BsmtFinType1</th>\n",
       "      <th>BsmtFinSF1</th>\n",
       "      <th>BsmtFinType2</th>\n",
       "      <th>BsmtFinSF2</th>\n",
       "      <th>BsmtUnfSF</th>\n",
       "      <th>TotalBsmtSF</th>\n",
       "      <th>Heating</th>\n",
       "      <th>HeatingQC</th>\n",
       "      <th>CentralAir</th>\n",
       "      <th>Electrical</th>\n",
       "      <th>1stFlrSF</th>\n",
       "      <th>2ndFlrSF</th>\n",
       "      <th>LowQualFinSF</th>\n",
       "      <th>GrLivArea</th>\n",
       "      <th>BsmtFullBath</th>\n",
       "      <th>BsmtHalfBath</th>\n",
       "      <th>FullBath</th>\n",
       "      <th>HalfBath</th>\n",
       "      <th>BedroomAbvGr</th>\n",
       "      <th>KitchenAbvGr</th>\n",
       "      <th>KitchenQual</th>\n",
       "      <th>TotRmsAbvGrd</th>\n",
       "      <th>Functional</th>\n",
       "      <th>Fireplaces</th>\n",
       "      <th>FireplaceQu</th>\n",
       "      <th>GarageType</th>\n",
       "      <th>GarageYrBlt</th>\n",
       "      <th>GarageFinish</th>\n",
       "      <th>GarageCars</th>\n",
       "      <th>GarageArea</th>\n",
       "      <th>GarageQual</th>\n",
       "      <th>GarageCond</th>\n",
       "      <th>PavedDrive</th>\n",
       "      <th>WoodDeckSF</th>\n",
       "      <th>OpenPorchSF</th>\n",
       "      <th>EnclosedPorch</th>\n",
       "      <th>3SsnPorch</th>\n",
       "      <th>ScreenPorch</th>\n",
       "      <th>PoolArea</th>\n",
       "      <th>PoolQC</th>\n",
       "      <th>Fence</th>\n",
       "      <th>MiscFeature</th>\n",
       "      <th>MiscVal</th>\n",
       "      <th>MoSold</th>\n",
       "      <th>YrSold</th>\n",
       "      <th>SaleType</th>\n",
       "      <th>SaleCondition</th>\n",
       "      <th>SalePrice</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>65.0</td>\n",
       "      <td>8450</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Reg</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>Inside</td>\n",
       "      <td>Gtl</td>\n",
       "      <td>CollgCr</td>\n",
       "      <td>Norm</td>\n",
       "      <td>Norm</td>\n",
       "      <td>1Fam</td>\n",
       "      <td>2Story</td>\n",
       "      <td>7</td>\n",
       "      <td>5</td>\n",
       "      <td>2003</td>\n",
       "      <td>2003</td>\n",
       "      <td>Gable</td>\n",
       "      <td>CompShg</td>\n",
       "      <td>VinylSd</td>\n",
       "      <td>VinylSd</td>\n",
       "      <td>BrkFace</td>\n",
       "      <td>196.0</td>\n",
       "      <td>Gd</td>\n",
       "      <td>TA</td>\n",
       "      <td>PConc</td>\n",
       "      <td>Gd</td>\n",
       "      <td>TA</td>\n",
       "      <td>No</td>\n",
       "      <td>GLQ</td>\n",
       "      <td>706</td>\n",
       "      <td>Unf</td>\n",
       "      <td>0</td>\n",
       "      <td>150</td>\n",
       "      <td>856</td>\n",
       "      <td>GasA</td>\n",
       "      <td>Ex</td>\n",
       "      <td>Y</td>\n",
       "      <td>SBrkr</td>\n",
       "      <td>856</td>\n",
       "      <td>854</td>\n",
       "      <td>0</td>\n",
       "      <td>1710</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>Gd</td>\n",
       "      <td>8</td>\n",
       "      <td>Typ</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Attchd</td>\n",
       "      <td>2003.0</td>\n",
       "      <td>RFn</td>\n",
       "      <td>2</td>\n",
       "      <td>548</td>\n",
       "      <td>TA</td>\n",
       "      <td>TA</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>61</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>208500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>20</td>\n",
       "      <td>RL</td>\n",
       "      <td>80.0</td>\n",
       "      <td>9600</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Reg</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>FR2</td>\n",
       "      <td>Gtl</td>\n",
       "      <td>Veenker</td>\n",
       "      <td>Feedr</td>\n",
       "      <td>Norm</td>\n",
       "      <td>1Fam</td>\n",
       "      <td>1Story</td>\n",
       "      <td>6</td>\n",
       "      <td>8</td>\n",
       "      <td>1976</td>\n",
       "      <td>1976</td>\n",
       "      <td>Gable</td>\n",
       "      <td>CompShg</td>\n",
       "      <td>MetalSd</td>\n",
       "      <td>MetalSd</td>\n",
       "      <td>None</td>\n",
       "      <td>0.0</td>\n",
       "      <td>TA</td>\n",
       "      <td>TA</td>\n",
       "      <td>CBlock</td>\n",
       "      <td>Gd</td>\n",
       "      <td>TA</td>\n",
       "      <td>Gd</td>\n",
       "      <td>ALQ</td>\n",
       "      <td>978</td>\n",
       "      <td>Unf</td>\n",
       "      <td>0</td>\n",
       "      <td>284</td>\n",
       "      <td>1262</td>\n",
       "      <td>GasA</td>\n",
       "      <td>Ex</td>\n",
       "      <td>Y</td>\n",
       "      <td>SBrkr</td>\n",
       "      <td>1262</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1262</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>TA</td>\n",
       "      <td>6</td>\n",
       "      <td>Typ</td>\n",
       "      <td>1</td>\n",
       "      <td>TA</td>\n",
       "      <td>Attchd</td>\n",
       "      <td>1976.0</td>\n",
       "      <td>RFn</td>\n",
       "      <td>2</td>\n",
       "      <td>460</td>\n",
       "      <td>TA</td>\n",
       "      <td>TA</td>\n",
       "      <td>Y</td>\n",
       "      <td>298</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>2007</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>181500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>68.0</td>\n",
       "      <td>11250</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>Inside</td>\n",
       "      <td>Gtl</td>\n",
       "      <td>CollgCr</td>\n",
       "      <td>Norm</td>\n",
       "      <td>Norm</td>\n",
       "      <td>1Fam</td>\n",
       "      <td>2Story</td>\n",
       "      <td>7</td>\n",
       "      <td>5</td>\n",
       "      <td>2001</td>\n",
       "      <td>2002</td>\n",
       "      <td>Gable</td>\n",
       "      <td>CompShg</td>\n",
       "      <td>VinylSd</td>\n",
       "      <td>VinylSd</td>\n",
       "      <td>BrkFace</td>\n",
       "      <td>162.0</td>\n",
       "      <td>Gd</td>\n",
       "      <td>TA</td>\n",
       "      <td>PConc</td>\n",
       "      <td>Gd</td>\n",
       "      <td>TA</td>\n",
       "      <td>Mn</td>\n",
       "      <td>GLQ</td>\n",
       "      <td>486</td>\n",
       "      <td>Unf</td>\n",
       "      <td>0</td>\n",
       "      <td>434</td>\n",
       "      <td>920</td>\n",
       "      <td>GasA</td>\n",
       "      <td>Ex</td>\n",
       "      <td>Y</td>\n",
       "      <td>SBrkr</td>\n",
       "      <td>920</td>\n",
       "      <td>866</td>\n",
       "      <td>0</td>\n",
       "      <td>1786</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>Gd</td>\n",
       "      <td>6</td>\n",
       "      <td>Typ</td>\n",
       "      <td>1</td>\n",
       "      <td>TA</td>\n",
       "      <td>Attchd</td>\n",
       "      <td>2001.0</td>\n",
       "      <td>RFn</td>\n",
       "      <td>2</td>\n",
       "      <td>608</td>\n",
       "      <td>TA</td>\n",
       "      <td>TA</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>42</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>223500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>70</td>\n",
       "      <td>RL</td>\n",
       "      <td>60.0</td>\n",
       "      <td>9550</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>Corner</td>\n",
       "      <td>Gtl</td>\n",
       "      <td>Crawfor</td>\n",
       "      <td>Norm</td>\n",
       "      <td>Norm</td>\n",
       "      <td>1Fam</td>\n",
       "      <td>2Story</td>\n",
       "      <td>7</td>\n",
       "      <td>5</td>\n",
       "      <td>1915</td>\n",
       "      <td>1970</td>\n",
       "      <td>Gable</td>\n",
       "      <td>CompShg</td>\n",
       "      <td>Wd Sdng</td>\n",
       "      <td>Wd Shng</td>\n",
       "      <td>None</td>\n",
       "      <td>0.0</td>\n",
       "      <td>TA</td>\n",
       "      <td>TA</td>\n",
       "      <td>BrkTil</td>\n",
       "      <td>TA</td>\n",
       "      <td>Gd</td>\n",
       "      <td>No</td>\n",
       "      <td>ALQ</td>\n",
       "      <td>216</td>\n",
       "      <td>Unf</td>\n",
       "      <td>0</td>\n",
       "      <td>540</td>\n",
       "      <td>756</td>\n",
       "      <td>GasA</td>\n",
       "      <td>Gd</td>\n",
       "      <td>Y</td>\n",
       "      <td>SBrkr</td>\n",
       "      <td>961</td>\n",
       "      <td>756</td>\n",
       "      <td>0</td>\n",
       "      <td>1717</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>Gd</td>\n",
       "      <td>7</td>\n",
       "      <td>Typ</td>\n",
       "      <td>1</td>\n",
       "      <td>Gd</td>\n",
       "      <td>Detchd</td>\n",
       "      <td>1998.0</td>\n",
       "      <td>Unf</td>\n",
       "      <td>3</td>\n",
       "      <td>642</td>\n",
       "      <td>TA</td>\n",
       "      <td>TA</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>35</td>\n",
       "      <td>272</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2006</td>\n",
       "      <td>WD</td>\n",
       "      <td>Abnorml</td>\n",
       "      <td>140000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>84.0</td>\n",
       "      <td>14260</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>FR2</td>\n",
       "      <td>Gtl</td>\n",
       "      <td>NoRidge</td>\n",
       "      <td>Norm</td>\n",
       "      <td>Norm</td>\n",
       "      <td>1Fam</td>\n",
       "      <td>2Story</td>\n",
       "      <td>8</td>\n",
       "      <td>5</td>\n",
       "      <td>2000</td>\n",
       "      <td>2000</td>\n",
       "      <td>Gable</td>\n",
       "      <td>CompShg</td>\n",
       "      <td>VinylSd</td>\n",
       "      <td>VinylSd</td>\n",
       "      <td>BrkFace</td>\n",
       "      <td>350.0</td>\n",
       "      <td>Gd</td>\n",
       "      <td>TA</td>\n",
       "      <td>PConc</td>\n",
       "      <td>Gd</td>\n",
       "      <td>TA</td>\n",
       "      <td>Av</td>\n",
       "      <td>GLQ</td>\n",
       "      <td>655</td>\n",
       "      <td>Unf</td>\n",
       "      <td>0</td>\n",
       "      <td>490</td>\n",
       "      <td>1145</td>\n",
       "      <td>GasA</td>\n",
       "      <td>Ex</td>\n",
       "      <td>Y</td>\n",
       "      <td>SBrkr</td>\n",
       "      <td>1145</td>\n",
       "      <td>1053</td>\n",
       "      <td>0</td>\n",
       "      <td>2198</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>Gd</td>\n",
       "      <td>9</td>\n",
       "      <td>Typ</td>\n",
       "      <td>1</td>\n",
       "      <td>TA</td>\n",
       "      <td>Attchd</td>\n",
       "      <td>2000.0</td>\n",
       "      <td>RFn</td>\n",
       "      <td>3</td>\n",
       "      <td>836</td>\n",
       "      <td>TA</td>\n",
       "      <td>TA</td>\n",
       "      <td>Y</td>\n",
       "      <td>192</td>\n",
       "      <td>84</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>250000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Id  MSSubClass MSZoning  LotFrontage  LotArea Street Alley LotShape  \\\n",
       "0   1          60       RL         65.0     8450   Pave   NaN      Reg   \n",
       "1   2          20       RL         80.0     9600   Pave   NaN      Reg   \n",
       "2   3          60       RL         68.0    11250   Pave   NaN      IR1   \n",
       "3   4          70       RL         60.0     9550   Pave   NaN      IR1   \n",
       "4   5          60       RL         84.0    14260   Pave   NaN      IR1   \n",
       "\n",
       "  LandContour Utilities LotConfig LandSlope Neighborhood Condition1  \\\n",
       "0         Lvl    AllPub    Inside       Gtl      CollgCr       Norm   \n",
       "1         Lvl    AllPub       FR2       Gtl      Veenker      Feedr   \n",
       "2         Lvl    AllPub    Inside       Gtl      CollgCr       Norm   \n",
       "3         Lvl    AllPub    Corner       Gtl      Crawfor       Norm   \n",
       "4         Lvl    AllPub       FR2       Gtl      NoRidge       Norm   \n",
       "\n",
       "  Condition2 BldgType HouseStyle  OverallQual  OverallCond  YearBuilt  \\\n",
       "0       Norm     1Fam     2Story            7            5       2003   \n",
       "1       Norm     1Fam     1Story            6            8       1976   \n",
       "2       Norm     1Fam     2Story            7            5       2001   \n",
       "3       Norm     1Fam     2Story            7            5       1915   \n",
       "4       Norm     1Fam     2Story            8            5       2000   \n",
       "\n",
       "   YearRemodAdd RoofStyle RoofMatl Exterior1st Exterior2nd MasVnrType  \\\n",
       "0          2003     Gable  CompShg     VinylSd     VinylSd    BrkFace   \n",
       "1          1976     Gable  CompShg     MetalSd     MetalSd       None   \n",
       "2          2002     Gable  CompShg     VinylSd     VinylSd    BrkFace   \n",
       "3          1970     Gable  CompShg     Wd Sdng     Wd Shng       None   \n",
       "4          2000     Gable  CompShg     VinylSd     VinylSd    BrkFace   \n",
       "\n",
       "   MasVnrArea ExterQual ExterCond Foundation BsmtQual BsmtCond BsmtExposure  \\\n",
       "0       196.0        Gd        TA      PConc       Gd       TA           No   \n",
       "1         0.0        TA        TA     CBlock       Gd       TA           Gd   \n",
       "2       162.0        Gd        TA      PConc       Gd       TA           Mn   \n",
       "3         0.0        TA        TA     BrkTil       TA       Gd           No   \n",
       "4       350.0        Gd        TA      PConc       Gd       TA           Av   \n",
       "\n",
       "  BsmtFinType1  BsmtFinSF1 BsmtFinType2  BsmtFinSF2  BsmtUnfSF  TotalBsmtSF  \\\n",
       "0          GLQ         706          Unf           0        150          856   \n",
       "1          ALQ         978          Unf           0        284         1262   \n",
       "2          GLQ         486          Unf           0        434          920   \n",
       "3          ALQ         216          Unf           0        540          756   \n",
       "4          GLQ         655          Unf           0        490         1145   \n",
       "\n",
       "  Heating HeatingQC CentralAir Electrical  1stFlrSF  2ndFlrSF  LowQualFinSF  \\\n",
       "0    GasA        Ex          Y      SBrkr       856       854             0   \n",
       "1    GasA        Ex          Y      SBrkr      1262         0             0   \n",
       "2    GasA        Ex          Y      SBrkr       920       866             0   \n",
       "3    GasA        Gd          Y      SBrkr       961       756             0   \n",
       "4    GasA        Ex          Y      SBrkr      1145      1053             0   \n",
       "\n",
       "   GrLivArea  BsmtFullBath  BsmtHalfBath  FullBath  HalfBath  BedroomAbvGr  \\\n",
       "0       1710             1             0         2         1             3   \n",
       "1       1262             0             1         2         0             3   \n",
       "2       1786             1             0         2         1             3   \n",
       "3       1717             1             0         1         0             3   \n",
       "4       2198             1             0         2         1             4   \n",
       "\n",
       "   KitchenAbvGr KitchenQual  TotRmsAbvGrd Functional  Fireplaces FireplaceQu  \\\n",
       "0             1          Gd             8        Typ           0         NaN   \n",
       "1             1          TA             6        Typ           1          TA   \n",
       "2             1          Gd             6        Typ           1          TA   \n",
       "3             1          Gd             7        Typ           1          Gd   \n",
       "4             1          Gd             9        Typ           1          TA   \n",
       "\n",
       "  GarageType  GarageYrBlt GarageFinish  GarageCars  GarageArea GarageQual  \\\n",
       "0     Attchd       2003.0          RFn           2         548         TA   \n",
       "1     Attchd       1976.0          RFn           2         460         TA   \n",
       "2     Attchd       2001.0          RFn           2         608         TA   \n",
       "3     Detchd       1998.0          Unf           3         642         TA   \n",
       "4     Attchd       2000.0          RFn           3         836         TA   \n",
       "\n",
       "  GarageCond PavedDrive  WoodDeckSF  OpenPorchSF  EnclosedPorch  3SsnPorch  \\\n",
       "0         TA          Y           0           61              0          0   \n",
       "1         TA          Y         298            0              0          0   \n",
       "2         TA          Y           0           42              0          0   \n",
       "3         TA          Y           0           35            272          0   \n",
       "4         TA          Y         192           84              0          0   \n",
       "\n",
       "   ScreenPorch  PoolArea PoolQC Fence MiscFeature  MiscVal  MoSold  YrSold  \\\n",
       "0            0         0    NaN   NaN         NaN        0       2    2008   \n",
       "1            0         0    NaN   NaN         NaN        0       5    2007   \n",
       "2            0         0    NaN   NaN         NaN        0       9    2008   \n",
       "3            0         0    NaN   NaN         NaN        0       2    2006   \n",
       "4            0         0    NaN   NaN         NaN        0      12    2008   \n",
       "\n",
       "  SaleType SaleCondition  SalePrice  \n",
       "0       WD        Normal     208500  \n",
       "1       WD        Normal     181500  \n",
       "2       WD        Normal     223500  \n",
       "3       WD       Abnorml     140000  \n",
       "4       WD        Normal     250000  "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.8828757597682129\n",
      "6.536281860064529\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x24fed652be0>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(train['SalePrice'].skew())\n",
    "print(train['SalePrice'].kurt())\n",
    "sns.distplot(train['SalePrice'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x24fed6ed2e8>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "train['SalePrice'] = np.log1p(train['SalePrice'])\n",
    "sns.distplot(train['SalePrice'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "all_data = pd.concat([train.loc[:, 'MSSubClass':'SaleCondition'],\n",
    "                    test.loc[:, 'MSSubClass':'SaleCondition']])\n",
    "\n",
    "numeric_feats = all_data.dtypes[all_data.dtypes != 'object'].index\n",
    "all_data[numeric_feats] = all_data[numeric_feats].apply(lambda x: np.log1p(x) if x.skew()>0.5 else x)\n",
    "\n",
    "all_data = pd.get_dummies(all_data)\n",
    "all_data.fillna(all_data.mean(), inplace=True)\n",
    "\n",
    "X_train = all_data[: train.shape[0]]\n",
    "X_test = all_data[train.shape[0]:]\n",
    "y = train['SalePrice']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 不借助第三方库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "    标准线性回归\n",
    "\"\"\"\n",
    "def standRegres(xArr, yArr):\n",
    "    xMat = np.mat(xArr); yMat=np.mat(yArr).T\n",
    "    xTx = xMat.T * xMat \n",
    "    if np.linalg.det(xTx) == 0:\n",
    "        print(\"The matrix is singular, cannot do inverse\")\n",
    "        return\n",
    "    ws = xTx.I * (xMat.T * yMat)\n",
    "    return ws \n",
    "\n",
    "\n",
    "ws = standRegres(X_train, y)\n",
    "\n",
    "y_preds = (np.mat(X_test) * ws).T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## sklearn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import RobustScaler\n",
    "from sklearn.model_selection import KFold\n",
    "from sklearn.linear_model import ElasticNetCV, LassoCV, RidgeCV\n",
    "from sklearn.svm import SVR\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "\n",
    "kfolds = KFold(n_splits=10, shuffle=True, random_state=42)\n",
    "\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_train, y, \n",
    "                                                    test_size=0.33,\n",
    "                                                    random_state=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "def rmse_cv(model):\n",
    "    rmse = np.sqrt(-cross_val_score(model, X_train, y, scoring='neg_mean_squared_error', cv=5))\n",
    "    return rmse\n",
    "\n",
    "model_ridge = Ridge()\n",
    "alphas = [0.03, 0.1, 0.3, 1, 3, 10, 30, 100]\n",
    "cv_ridge = [rmse_cv(Ridge(alpha=alpha)).mean() for alpha in alphas]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0,0.5,'rmse')"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cv_ridge = pd.Series(cv_ridge, index=alphas)\n",
    "cv_ridge.plot(title='Validation')\n",
    "plt.xlabel('alpha')\n",
    "plt.ylabel('rmse')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.1275845312251826"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cv_ridge.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.12493981729048213"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "alphas=[1, 0.3, 0.1, 0.03, 0.01, 0.003, 0.001, 0.0003, 0.0001, 0.00003, 0.00001]\n",
    "model_lasso = LassoCV(alphas=alphas, max_iter=20000).fit(X_train, y)\n",
    "rmse_cv(model_lasso).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 [0.38677605 0.42513731 0.40996858 0.38299663 0.39124987] 0.39922568603836983\n",
      "0.3 [0.2943137  0.32661156 0.32514158 0.31051156 0.31088459] 0.3134925986992932\n",
      "0.1 [0.28350831 0.31119626 0.31418553 0.30782025 0.3081719 ] 0.3049764513651272\n",
      "0.03 [0.25519077 0.28147201 0.28516419 0.28052506 0.28272229] 0.2770148663483651\n",
      "0.01 [0.24487465 0.2716083  0.26506762 0.26489646 0.27698246] 0.26468589759318967\n",
      "0.003 [0.23789544 0.26412747 0.25485743 0.25843086 0.27361431] 0.25778510139058564\n",
      "0.001 [0.18716398 0.21013631 0.20147985 0.19300739 0.21264572] 0.20088665232281827\n",
      "0.0003 [0.15235046 0.17632147 0.16600097 0.15548403 0.18106536] 0.16624445757618903\n",
      "0.0001 [0.13174253 0.15501984 0.14832009 0.13443229 0.16980264] 0.14786347847870868\n",
      "3e-05 [0.10901351 0.13881309 0.13111727 0.11376168 0.15215797] 0.1289727036450014\n",
      "1e-05 [0.10395399 0.13251232 0.12445599 0.10825565 0.1463297 ] 0.12310153019393573\n"
     ]
    }
   ],
   "source": [
    "for alpha in alphas:\n",
    "    model_lasso = LassoCV(alpha, max_iter=50000).fit(X_train, y)\n",
    "    print(alpha, rmse_cv(model_lasso), rmse_cv(model_lasso).mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "preds = model_lasso.predict(X_test)\n",
    "solution = pd.DataFrame({'id':test.Id, 'SalePrice':np.expm1(preds)})\n",
    "solution.to_csv('linear_sol.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([11.69088272, 11.93928127, 12.10957439, ..., 12.02977826,\n",
       "       11.68924528, 12.33378407])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "preds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.11111691, 0.13814161, 0.12614568, 0.11194806, 0.1505704 ])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "alphas_ridge = [1,3,10, 100, 14.5, 14.6, 14.7, 14.8, 14.9, 15, 15.1, 15.2, 15.3, 15.4, 15.5]\n",
    "model_ridge = RidgeCV(alphas=[10], cv=kfolds)\n",
    "rmse_cv(model_ridge.fit(X_train, y))\n",
    "\n",
    "# for alpha in alphas_ridge:\n",
    "#     model_ridge = RidgeCV(alphas=[alpha], cv=kfolds)\n",
    "#     print(alpha, rmse_cv(model_ridge).mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.10180521 0.13921723 0.1210353  0.10344578 0.15054099] 0.12320890174561376\n"
     ]
    }
   ],
   "source": [
    "svr = make_pipeline(RobustScaler(), SVR(C=20, epsilon=0.008, gamma=0.0003))\n",
    "svr.fit(X_train, y)\n",
    "print(rmse_cv(svr), rmse_cv(svr).mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "lasso_pred = model_lasso.predict(X_test)\n",
    "ridge_pred = model_ridge.predict(X_test)\n",
    "svr_pred = svr.predict(X_test)\n",
    "\n",
    "pred = 0.33*lasso_pred + 0.33*svr_pred + 0.33*ridge_pred\n",
    "solution = pd.DataFrame({'id':test.Id, 'SalePrice':np.expm1(preds)})\n",
    "solution.to_csv('submission_2019-12-08.csv', index=False)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
